這篇是介紹field data types的第三篇
主要介紹text, keyword差異以及multi-fields
keyword type family
keyword family包含了以下的field types:
keyword: 用來儲存結構的內容,例如: IDs, email, 主機名稱, and etcconstant_keyword: 如其名,儲存相同的值wildcard: 優化logs,可使用像是 grep功能的 wildcard queries
此處僅詳細介紹最常被使用到的 keyword
keyword fields 很常在 sorting , aggregations 以及 term-level queries 使用他
而如果要使用 full-text search(全文檢索)功能的話,要避免使用 keyword fields ,
改用 text field type
issue(議題): identifiers (id) 該使用 numeric field data type, 像是 integer, long field data type,還是使用 keyword fields呢?
說明這兩個data type對於哪種query比較優,便可清楚明瞭,
numeric,即 integer, long field data type,使用 range queries 比較優keyword field data type 使用 term 或 其他的 term-level queries 比較好
舉幾個實例:
range),比較常用字串比對來找書(term-level)當然,如果覺得猶豫不決,覺得兩個都有需要,可以透過 multi-fields 來達成,此篇文章後半段會介紹
text field type
此field可使用全文檢索query,輸入的值即為 full-text values (全文檢索的值),
被定義為 text 的field 輸入的值是會被 analyzed (分析) 的,
會經過 analyzer ,把 string 轉換成許多獨立的terms,然後才建立索引
text fields 不是被拿來用作 sorting , aggregations 的,
如果要使用 structured content,則使用 keyword field
所以會納悶,那假如我現在某一個field是希望有 full text(text) 又有 structured content(keyword)來 sorting , aggregations 怎麼辦?
很簡單,就建立一個text,也建立一個keyword,這就是 multi-fields
multi-fields
為了不同的目的,對一樣的field用不同方法來建立索引,即為 multi-fields
例如: 一個 string field,為了全文檢索而建立了 text field,為了排序或aggs而建立了 keyword field
mapping parameters 之一 fields,
上述在定義 field type時,是填入 type,而 fields 就是和 type 同level的另一個參數
直接看範例
Reqeust
PUT my-index-000006
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": { (2)
"raw": { (1)
"type": "keyword"
}
}
}
}
}
}
(1): city.raw field 是 city field 的 keyword 版本, 這邊的 raw 可以自定義
(2): fields 為 mapping parameters
index sample documents
PUT my-index-000006/_doc/1
{
"city": "New York"
}
PUT my-index-000006/_doc/2
{
"city": "York"
}
full text search with sorting and aggs
GET my-index-000006/_search
{
"query": {
"match": {
"city": "york" (1)
}
},
"sort": {
"city.raw": "asc" (2)
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw" (2)
}
}
}
}
(1): 有著 text field data type 的 city,使用 全文檢索
(2): 有著 keyword field data type 的 city.raw ,使用 sorting(排序) 和 aggs(後分類)
Response
剛提到,這邊的 raw 是可以自定義的,不知道在讀前幾重,使用後分類 term query的時候,其實是都使用 keyword,為什麼呢?
直接新增一筆資料且index尚未被建立
PUT my-index-000007/_doc/1
{
"country": "Taiwan"
}
查看mapping
GET my-index-000007/_mapping
Response
可以發現到 fields 下是 keyword,且有著 keyword field data type
簡單來說就是,es預設遇到 string field時,是會幫你建立兩個field,且field data type為 text 和 keyword ,其中 keyword field data type 的field name 是 keyword,以此為例,使用排序或後分類則用 country.keyword
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正